package my.dao;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import my.dto.Result;
import my.org.json.JSONArray;
import my.org.json.JSONObject;

/**
 * 访问数据库的便捷工具类
 * @version 3.0
 * @author 夏冬琦
 *
 */
public class MyDao {		
	
	private static class RecordImpl implements Rec{
		
		private Map<String , Object> map;
		
		private RecordImpl(Map<String, Object> map) {
			super();
			this.map = map;
		}

		public Object get(String fieldLabel) throws DaoException{
			
			String key=fieldLabel.toLowerCase();
			if(!map.containsKey(key)){
				throw new DaoException("不正确的字段名称："+fieldLabel+",字段名称应在select列表中出现。");
			}
			return map.get(key);
			
			
		}

		public int getInt(String fieldLabel) throws DaoException {
			Object value=get(fieldLabel);
			if(value==null)return 0;
			
			
			if(value instanceof Number){
				return ((Number)value).intValue();
			}
			try {
				return Integer.parseInt(value.toString());
			} catch (NumberFormatException e) {
				throw new DaoException("字段("+fieldLabel+")的值（"+value+"）无法转化为int类型。",e);
			}
		}

		public long getLong(String fieldLabel) throws DaoException {
			Object value=get(fieldLabel);
			if(value==null)return 0L;
			
			if(value instanceof Number){
				return ((Number)value).longValue();
			}
			try {
				return Long.parseLong(value.toString());
			} catch (NumberFormatException e) {
				throw new DaoException("字段("+fieldLabel+")的值（"+value+"）无法转化为long类型。",e);
			}
		}

		public float getFloat(String fieldLabel)
				throws DaoException {
			Object value=get(fieldLabel);
			if(value==null)return 0.0F;
			
			if(value instanceof Number){
				return ((Number)value).floatValue();
			}
			try {
				return Float.parseFloat(value.toString());
			} catch (NumberFormatException e) {
				throw new DaoException("字段("+fieldLabel+")的值（"+value+"）无法转化为float类型。",e);
			}
		}

		public double getDouble(String fieldLabel)
				throws DaoException {
			Object value=get(fieldLabel);
			if(value==null)return 0.0;
			
			if(value instanceof Number){
				return ((Number)value).doubleValue();
			}
			try {
				return Double.parseDouble(value.toString());
			} catch (NumberFormatException e) {
				throw new DaoException("字段("+fieldLabel+")的值（"+value+"）无法转化为double类型。",e);
			}
		}

		public boolean getBoolean(String fieldLabel)
				throws DaoException {
			
			Object value=get(fieldLabel);
			if(value==null)return false;
			
			if(value instanceof Number){
				return ((Number)value).intValue()!=0;
			}
			try {
				return Integer.parseInt(value.toString())!=0;
			} catch (NumberFormatException e) {
				try {
					return Boolean.parseBoolean(value.toString());
				} catch (Exception e1) {
					throw new DaoException("字段("+fieldLabel+")的值（"+value+"）无法转化为boolean类型。",e);
				}
				
			}
		}

		public String getString(String fieldLabel)
				throws DaoException {
			Object value=get(fieldLabel);
			if(value==null)return null;
			return value.toString();
			
		}

		public Date getDate(String fieldLabel) throws DaoException {
			Object value=get(fieldLabel);
			if(value==null)return null;
			
			if(value instanceof java.util.Date){
				return (java.util.Date)value;
			}
			try {
				return new java.text.SimpleDateFormat("yyyy-MM-dd").parse(value.toString());
			} catch (ParseException e) {
				throw new DaoException("字段("+fieldLabel+")的值（"+value+"）无法转化为java.util.Date类型。",e);
			}
		}
		
		public Date getDate(String fieldLabel,final String pattern) throws DaoException {
			final java.text.SimpleDateFormat fmt=new java.text.SimpleDateFormat(pattern);
			Object value=get(fieldLabel);
			if(value==null)return null;
			
			if(value instanceof java.util.Date){
				
				return new java.util.Date((((java.util.Date)value).getTime())){
					
					
					/**
					 * 
					 */
					private static final long serialVersionUID = 148965741791385964L;

					@Override
					public String toString() {
						return fmt.format(this);
					}
				};
				
			}
			try {
				return new java.util.Date(fmt.parse(value.toString()).getTime()){

					/**
					 * 
					 */
					private static final long serialVersionUID = 4387736379688236068L;

					@Override
					public String toString() {
						return fmt.format(this);
					}
				};
				
			} catch (ParseException e) {
				throw new DaoException("字段("+fieldLabel+")的值（"+value+"）无法转化为java.util.Date类型。",e);
			}
		}
		
		@Override
		public String toString() {			
			return map.toString();
		}
		
	}
	
	
	/**
	 * 执行用于更新的sql语句，如update 、delete、insert和create等sql语句。
	 * @param sql sql语句
	 * @param args sql语句"?"占位符对应的参数值
	 * @return 返回影响行数，int类型。
	 * @throws DaoException
	 */
	public static int update(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.update(sql, args);			
		}catch(DaoException e){			
			throw e;
		}finally{
			dao.close();
		}
	}
	/**
	 * 执行多条更新（insert、update、delete等）的sql语句，
	 * @param sqls
	 * @throws DaoException
	 */
	public static void updateMulti(SQL... sqls)throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_YES);
		try{
			dao.beginTransaction();
			for(SQL sql:sqls){
				dao.update(sql.getSql(), sql.getArgs());
			}			
			dao.commitTransaction();
		}catch(DaoException e){	
			dao.rollbackTransaction();
			throw e;
		}finally{
			dao.close();
		}
	}
	
	/**
	 * 执行查询sql语句，获得记录集(RecList)对象，该对象内部封装了很多数据记录(Rec)对象
	 * @param sql
	 * @param args
	 * @return 返回记录集(RecList)对象
	 * @throws DaoException
	 */
	public static RecList query(String sql,Object... args )throws DaoException{
		
		final List<Rec> list=new ArrayList<Rec>();
		
		RecList recs=new RecList(){

			
			public Rec recAt(int idx)throws DaoException {
				if(idx<0||idx>=list.size())
					throw new DaoException("超出范围的记录索引号："+idx+",正确的记录索引号应当在0-"+list.size()+"之间。");
				return list.get(idx);
			}

			
			public int size() {
				return list.size();
			}
			
			@Override
			public String toString() {
				return list.toString();
			}
			
		};
		
		
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{
			
			ResultSet rs=dao.query(sql, args);
			ResultSetMetaData md=rs.getMetaData();
			while(rs.next()){
				
				Map<String , Object> map=new HashMap<String,Object>();
				for(int i=1;i<=md.getColumnCount();i++){					
					map.put(md.getColumnLabel(i).toLowerCase(), rs.getObject(i));
				}
				
				list.add(new RecordImpl(map));
			}
			return recs;
			
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行查询sql语句，获得一条数据记录（Rec）对象
	 * @param sql
	 * @param args
	 * @return 返回一条数据记录（Rec）对象
	 * @throws DaoException
	 */
	public static Rec queryOne(String sql,Object... args )throws DaoException{
		
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{
			
			ResultSet rs=dao.query(sql, args);
			ResultSetMetaData md=rs.getMetaData();
			if(rs.next()){
				
				Map<String , Object> map=new HashMap<String,Object>();
				for(int i=1;i<=md.getColumnCount();i++){					
					map.put(md.getColumnLabel(i).toLowerCase(), rs.getObject(i));
				}
				
				return new RecordImpl(map);
			}
			return null;
			
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，返回值为List集合，其元素为Map集合表示一条查询记录。这种Map集合的键为列标（全小写），值为列值。
	 * @param sql sql语句
	 * @param args sql语句"?"占位符对应的参数值
	 * @return 返回List<Map<String, Object>>类型对象
	 * @throws DaoException
	 */
	public static List<Map<String,Object>> queryMapList(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryMapList(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	
	
	/**
	 * 执行用于查询（select）sql语句，获得一个Map集合对象，该Map集合表示一条查询记录。这种Map集合的键为列标（全小写），值为列值。
	 * @param sql sql语句
	 * @param args sql语句"?"占位符对应的参数值
	 * @return 返回Map<String, Object>类型对象
	 * @throws DaoException
	 */
	public static Map<String,Object> queryMap(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryUniqueMap(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，返回值为JavaBean对象的List集合，JavaBean对象的类型由第一个参数beanClass确定。
	 * @param beanClass
	 * @param sql
	 * @param args
	 * @return 返回值为JavaBean对象的List集合，JavaBean对象的类型由第一个参数beanClass确定。
	 * @throws DaoException
	 */
	public static <T> List<T> queryBeanList(Class<T> beanClass,String sql, Object... args) throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryBeanList(beanClass, sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
	}
	
	/**
	 * 执行用于查询（select）sql语句，返回值为数组对象，其元素为JavaBean对象表示一条查询记录。
	 * @param beanClass
	 * @param sql
	 * @param args
	 * @return 返回值为数组对象，其元素为JavaBean对象表示一条查询记录。
	 * @throws DaoException
	 */
	public static <T> Object[] queryBeanArray(Class<T> beanClass,String sql, Object... args) throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryBeanArray(beanClass, sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个JavaBean对象，JavaBean对象的类型由第一个参数beanClass确定。
	 * @param beanClass
	 * @param sql
	 * @param args
	 * @return 返回JavaBean对象，JavaBean对象的类型由第一个参数beanClass确定。
	 * @throws DaoException
	 */
	public static <T> T queryBean(Class<T> beanClass,String sql, Object... args) throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			return dao.queryUniqueBean(beanClass, sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
	}
	
	/**
	 * 执行用于查询（select）sql语句，返回值为Object[][]对象，其元素为数组对象表示一条查询记录，这种数组的每一个元素是一个列值。
	 * @param sql
	 * @param args
	 * @return 返回值为Object[][]对象，其元素为数组对象表示一条查询记录，这种数组的每一个元素是一个列值。
	 * @throws DaoException
	 */
	public static Object[][] queryArrays(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			return dao.queryArrayArray(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	/**
	 * 执行用于查询（select）sql语句，获得一个数组，该数组封装了一条记录，数组的每个元素对应一个列值。
	 * @param sql
	 * @param args
	 * @return 返回数组，该数组封装了一条记录，数组的每个元素对应一个列值
	 * @throws DaoException
	 */
	public static Object[] queryOneArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			return dao.queryUniqueArray(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个整数。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Integer queryInteger(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryInteger(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	 /**
	  * 执行用于查询（select）sql语句，获得一个整数数组。
	  * @param sql
	  * @param args
	  * @return
	  * @throws DaoException
	  */
	public static Integer[] queryIntegerArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			List<Integer> list=dao.queryIntegerList(sql, args);
			return list.toArray(new Integer[list.size()]);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个长整数。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Long queryLong(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryLong(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个长整数数组。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Long[] queryLongArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			List<Long> list=dao.queryLongList(sql, args);
			return list.toArray(new Long[list.size()]);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个单精度浮点数。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Float queryFloat(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryFloat(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个单精度浮点数数组。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Float[] queryFloatArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			List<Float> list=dao.queryFloatList(sql, args);
			return list.toArray(new Float[list.size()]);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个双精度浮点数。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Double queryDouble(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryDouble(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个双精度浮点数数组。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Double[] queryDoubleArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			List<Double> list=dao.queryDoubleList(sql, args);
			return list.toArray(new Double[list.size()]);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个布尔值。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Boolean queryBoolean(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryBoolean(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个布尔值数组。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static Boolean[] queryBooleanArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			List<Boolean> list=dao.queryBooleanList(sql, args);
			return list.toArray(new Boolean[list.size()]);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个java.util.Date对象。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static java.util.Date queryDate(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryDate(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个java.util.Date对象数组。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static java.util.Date[] queryDateArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			List<java.util.Date> list=dao.queryDateList(sql, args);
			return list.toArray(new java.util.Date[list.size()]);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个字符串（String）。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static String queryString(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return dao.queryString(sql, args);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	/**
	 * 执行用于查询（select）sql语句，获得一个字符串（String）数组。
	 * @param sql
	 * @param args
	 * @return
	 * @throws DaoException
	 */
	public static String[] queryStringArray(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{	
			List<String> list=dao.queryStringList(sql, args);
			return list.toArray(new String[list.size()]);
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	

	
	/**
	 * 执行用于查询（select）sql语句，返回第一行第一列字段值，值类型由第一个参数指定。
	 * @param valueType
	 * @param sql
	 * @param args
	 * @return 返回第一行第一列字段值，值类型由第一个参数指定。
	 * @throws DaoException
	 */
	public static <T> T queryValue(Class<T> valueType,String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			
			ResultSet rs=dao.query(sql, args);			
			if(rs.next()){				
				return RowMapperUtil.fieldValue(valueType, rs, 1);
			}
			return null;
			
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	
	/**
	 * 执行用于查询（select）sql语句，返回第一列字段值的数组,元素值类型由第一个参数指定。
	 * @param valueType
	 * @param sql
	 * @param args
	 * @return 返回第一列字段值的数组,元素值类型由第一个参数指定。
	 * @throws DaoException
	 */
	public static <T> Object[] queryValueArray(Class<T> valueType,String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			List<T> list=new ArrayList<T>();
			ResultSet rs=dao.query(sql, args);			
			while(rs.next()){				
				list.add(RowMapperUtil.fieldValue(valueType, rs, 1));
			}
			return list.toArray();
			
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
	
	/**
	 * 执行用于更新的sql语句，如update 、delete、insert和create等sql语句,返回表示执行结果的json串,该json串的格式如下：
	 * {
	 * 	"success":true/false,
	 * 	"message":"信息",
	 * 	"updateRows":影响行数 
	 * }
	 * 
	 * @param sql sql语句
	 * @param args sql语句"?"占位符对应的参数值
	 * @return 返回表示执行结果的json串。
	 * @throws DaoException
	 */
	public static String updateGetJson(String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			int cnt= dao.update(sql, args);	
			StringBuilder builder=new StringBuilder("{");
			if(cnt>0){
				builder.append("\"success\":true,");
				builder.append("\"message\":\"数据更新成功！\",");
			}else{
				builder.append("\"success\":fasle,");
				builder.append("\"message\":\"数据未能更新！请检查提交数据是否正确。\",");
			}
			builder.append("\"updateRows\":"+cnt);			
			builder.append("}");
			return builder.toString();
		}catch(DaoException e){			
			throw e;
		}finally{
			dao.close();
		}
	}
	
	
	
	/**
	 * 执行查询sql语句，获得一条数据记录一json串的形式返回，其中属性名为小写形式的字段名称，属性值为字段值
	 * @param sql
	 * @param args
	 * @return 返回封装了一条数据记录json串对对象
	 * @throws DaoException
	 */
	public static String queryOneJson(String sql,Object... args){
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{
			
			ResultSet rs=dao.query(sql, args);
			ResultSetMetaData md=rs.getMetaData();
			if(rs.next()){
				
				Map<String , Object> map=new HashMap<String,Object>();
				for(int i=1;i<=md.getColumnCount();i++){					
					map.put(md.getColumnLabel(i).toLowerCase(), rs.getObject(i));
				}
				return new JSONObject(map).toString();
				
			}
			return null;
			
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
	}
	
	/**
	 * 执行用于查询（select）sql语句，返回以json数组串形式封装的记录集。其中json对象属性名为小写形式的字段名称，属性值为字段值。
	 * @param sql sql语句
	 * @param args sql语句"?"占位符对应的参数值
	 * @return 返回以json数组串形式封装的记录集。其中json对象属性名为小写形式的字段名称，属性值为字段值。
	 * @throws DaoException
	 */
	public static String queryJsonArray(String sql,Object... args){
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			List<Map<String,Object>> mapList=dao.queryMapList(sql, args);
			return new JSONArray(mapList).toString();
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
	}
	
	/**
	 * 执行用于查询（select）sql语句，以指定的JavaBean类型为对象模型，返回封装一条记录的json串。
	 * @param beanClass
	 * @param sql
	 * @param args
	 * @return 返回封装一条记录的json串，该json串以指定的JavaBean类型为对象模型。
	 * @throws DaoException
	 */
	public static <T> String queryOneJson(Class<T> beanClass,String sql, Object... args) throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{
			T bean= dao.queryUniqueBean(beanClass, sql, args);
			if(bean!=null)
				return new JSONObject(dao.queryUniqueBean(beanClass, sql, args)).toString();
			else
				return null;
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
	}
	
	
	/**
	 * 执行用于查询（select）sql语句，返回以json数组串形式封装的记录集，其中json对象依据指定的JavaBean类型为对象模型生成。
	 * @param beanClass
	 * @param sql
	 * @param args
	 * @return 返回以json数组串形式封装的记录集，其中json对象依据指定的JavaBean类型为对象模型生成。
	 * @throws DaoException
	 */
	public static <T> String queryJsonArray(Class<T> beanClass,String sql, Object... args) throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			return new JSONArray(dao.queryBeanList(beanClass, sql, args)).toString();
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
	}
	
	/**
	 * 执行用于查询（select）sql语句，返回以json数组串形式封装的[单字段值的]记录集,元素值类型由第一个参数指定。
	 * @param valueType
	 * @param sql
	 * @param args
	 * @return 返回以json数组串形式封装的[单字段值的]记录集,元素值类型由第一个参数指定。
	 * @throws DaoException
	 */
	public static <T> String queryValueJsonArray(Class<T> valueType,String sql,Object... args )throws DaoException{
		Dao dao=DaoCreater.createDao(Dao.TX_USE_NO);
		try{			
			List<T> list=new ArrayList<T>();
			ResultSet rs=dao.query(sql, args);			
			while(rs.next()){				
				list.add(RowMapperUtil.fieldValue(valueType, rs, 1));
			}
			return new JSONArray(list).toString();
			
		}catch(Exception e){			
			if(e instanceof DaoException)throw (DaoException)e;
			else throw new DaoException(e);
		}finally{
			dao.close();
		}
		
	}
	
		
	/**
	 * 根据传入的参数生成封装消息的json串，如下格式：
	 * {
	 * 	"success":true/false,
	 * 	"message":"信息"
	 * }
	 * @param success
	 * @param message
	 * @return 返回封装消息的json
	 */
	public static String jsonResult(boolean success,String message){
		//return "{\"success\":"+success+",\"message\":\""+message+"\"}";
		if(success) {
			return new JSONObject(Result.successResult(message)).toString();
		}
		return new JSONObject(Result.failResult(message)).toString();
		
	}
	
	/**
	 * 根据传入的参数生成封装消息的json串，如下格式：
	 * {
	 * 	"success":true/false,
	 * 	"message":"信息"
	 * 	"data":数据对象
	 * }
	 * @param success
	 * @param message
	 * @param data
	 * @return 返回封装消息的json
	 */
	public static String jsonResult(boolean success,String message,Object data){
		//return "{\"success\":"+success+",\"message\":\""+message+"\"}";
		if(success) {
			return new JSONObject(Result.successResult(message,data)).toString();
		}
		return new JSONObject(Result.failResult(message,data)).toString();
		
	}	
	
}
